home *** CD-ROM | disk | FTP | other *** search
- /*
- * WINLIB
- * Resizing routines
- */
-
- #include "winlib.h"
-
- void _redraw_window(void)
- {
- int i;
-
- /* And let the work window become scrollable */
- scrollok(_wintree->workwin, TRUE);
-
- /* Draw the borders */
- for(i = 0; i < _wintree->win->_maxx; i++) {
- mvwaddch(_wintree->win, 0, i, ACS_DHLINE);
- mvwaddch(_wintree->win, _wintree->win->_maxy, i, ACS_DHLINE);
- }
-
- for(i = 0; i < _wintree->win->_maxy; i++) {
- mvwaddch(_wintree->win, i, 0, ACS_DVLINE);
- mvwaddch(_wintree->win, i, _wintree->win->_maxx, ACS_DVLINE);
- }
-
- /* Add the corners */
- mvwaddch(_wintree->win, 0, 0, ACS_DULCORNER);
- mvwaddch(_wintree->win, 0, _wintree->win->_maxx, ACS_DURCORNER);
- mvwaddch(_wintree->win, _wintree->win->_maxy, 0, ACS_DLLCORNER);
- mvwaddch(_wintree->win, _wintree->win->_maxy, _wintree->win->_maxx, ACS_DLRCORNER);
-
- /* And the title */
- i = (_wintree->win->_maxx - strlen(_wintree->title)) / 2;
- mvwaddstr(_wintree->win, 0, i, _wintree->title);
-
- /* Add a closer button if there is one */
- if (_wintree->mode & CLOSER) {
- mvwaddch(_wintree->win, 0, 1, '[');
- mvwaddch(_wintree->win, 0, 2, ACS_BULLET);
- mvwaddch(_wintree->win, 0, 3, ']');
- }
-
- /* Add a mover indicator around the title bar if you can move the window */
- if (_wintree->mode & MOVER) {
- mvwaddch(_wintree->win, 0, i - 1, ' ');
- mvwaddch(_wintree->win, 0, i - 2, '[');
- mvwaddch(_wintree->win, 0, i + strlen(_wintree->title), ' ');
- mvwaddch(_wintree->win, 0, i + strlen(_wintree->title) + 1, ']');
- }
-
- i = 0;
-
- /* Put a minimizer button in */
- if (_wintree->mode & MINIMIZER) {
- mvwaddch(_wintree->win, 0, _wintree->win->_maxx - 1, ']');
- mvwaddch(_wintree->win, 0, _wintree->win->_maxx - 2, ACS_DARROW);
- mvwaddch(_wintree->win, 0, _wintree->win->_maxx - 3, '[');
- i = 3;
- }
-
- /* And a maximizer */
- if (_wintree->mode & MAXIMIZER) {
- mvwaddch(_wintree->win, 0, _wintree->win->_maxx - (1 + i), ']');
- mvwaddch(_wintree->win, 0, _wintree->win->_maxx - (2 + i), ACS_UARROW);
- mvwaddch(_wintree->win, 0, _wintree->win->_maxx - (3 + i), '[');
- }
-
- /* And the sizer stuff */
- if (_wintree->mode & SIZER) {
- mvwaddch(_wintree->win, 0, 0, ACS_ULCORNER);
- mvwaddch(_wintree->win, 0, _wintree->win->_maxx, ACS_URCORNER);
- mvwaddch(_wintree->win, _wintree->win->_maxy, 0, ACS_LLCORNER);
- mvwaddch(_wintree->win, _wintree->win->_maxy, _wintree->win->_maxx, ACS_LRCORNER);
- }
- }
-
- void _do_resize(Gpm_Event *event)
- {
- /* Upper left */
- if ((_resize_corner == 1) && (_cur_window != -1)) {
- int w, h, found = 0;
-
- w = _wintree->cur.x + _wintree->cur.w;
- h = _wintree->cur.y + _wintree->cur.h;
-
- if (event->y < 1)
- event->y = 1;
-
- if (event->x < _wintree->cur.x) {
- int diff = abs(event->x - _wintree->cur.x);
-
- _wintree->cur.w += diff;
- _wintree->cur.x = event->x;
- found = 1;
- } else if ((event->x > _wintree->cur.x) && (!found)) {
- int diff = abs(event->x - _wintree->cur.x);
-
- _wintree->cur.w -= diff;
- _wintree->cur.x = event->x;
- found = 1;
- }
-
- found = 0;
-
- if ((event->y < _wintree->cur.y) && (!found)) {
- int diff = abs(event->y - _wintree->cur.y);
-
- _wintree->cur.h += diff;
- _wintree->cur.y = event->y;
- found = 1;
- } else if ((event->y > _wintree->cur.y) && (!found)) {
- int diff = abs(event->y - _wintree->cur.y);
-
- _wintree->cur.h -= diff;
- _wintree->cur.y = event->y;
- }
-
- if (_wintree->cur.w < 8) {
- _wintree->cur.w = 8;
- _wintree->cur.x = w - 8;
- }
-
- if (_wintree->cur.h < 4) {
- _wintree->cur.h = 4;
- _wintree->cur.y = h - 4;
- }
- }
-
- /* Upper right */
- if ((_resize_corner == 2) && (_cur_window != -1)) {
- int found = 0, h;
-
- h = _wintree->cur.y + _wintree->cur.h;
-
- if (event->y < 1)
- event->y = 1;
-
- if (event->x < (_wintree->cur.x + _wintree->cur.w)) {
- int diff = abs(event->x - (_wintree->cur.x + _wintree->cur.w));
-
- _wintree->cur.w -= diff;
- _wintree->cur.w++;
- found = 1;
- } else if ((event->x >= (_wintree->cur.x + _wintree->cur.w)) && (!found)) {
- int diff = abs(event->x - (_wintree->cur.x + _wintree->cur.w));
-
- _wintree->cur.w += diff;
- _wintree->cur.w++;
- found = 1;
- }
-
- found = 0;
-
- if ((event->y < _wintree->cur.y) && (!found)) {
- int diff = abs(event->y - _wintree->cur.y);
-
- _wintree->cur.h += diff;
- _wintree->cur.y = event->y;
- found = 1;
- } else if ((event->y > _wintree->cur.y) && (!found)) {
- int diff = abs(event->y - _wintree->cur.y);
-
- _wintree->cur.h -= diff;
- _wintree->cur.y = event->y;
- }
-
- if (_wintree->cur.w < 8)
- _wintree->cur.w = 8;
- if (_wintree->cur.h < 4) {
- _wintree->cur.h = 4;
- _wintree->cur.y = h - 4;
- }
- }
-
- /* Lower left */
- if ((_resize_corner == 3) && (_cur_window != -1)) {
- int x, y, w, h, found = 0;
-
- x = _wintree->cur.x;
- y = _wintree->cur.y;
- w = _wintree->cur.x + _wintree->cur.w;
- h = _wintree->cur.y + _wintree->cur.h;
-
- if (event->y < 1)
- event->y = 1;
-
- if (event->x < _wintree->cur.x) {
- int diff = abs(event->x - _wintree->cur.x);
-
- _wintree->cur.w += diff;
- _wintree->cur.x = event->x;
- found = 1;
- } else if ((event->x > _wintree->cur.x) && (!found)) {
- int diff = abs(event->x - _wintree->cur.x);
-
- _wintree->cur.w -= diff;
- _wintree->cur.x = event->x;
- found = 1;
- }
-
- found = 0;
-
- _wintree->cur.h = event->y - _wintree->win->_begy;
- _wintree->cur.h++;
-
- if (_wintree->cur.w < 8) {
- _wintree->cur.w = 8;
- _wintree->cur.x = w - 8;
- }
-
- if (_wintree->cur.h < 4)
- _wintree->cur.h = 4;
- }
-
- /* Lower right */
- if ((_resize_corner == 4) && (_cur_window != -1)) {
- if (event->y < 1)
- event->y = 1;
-
- _wintree->cur.w = event->x - _wintree->win->_begx;
- _wintree->cur.h = event->y - _wintree->win->_begy;
-
- _wintree->cur.w++;
- _wintree->cur.h++;
-
- if (_wintree->cur.w < 8)
- _wintree->cur.w = 8;
- if (_wintree->cur.h < 4)
- _wintree->cur.h = 4;
- }
-
- /* And process it all */
- if ((_cur_window != -1) && (_resize_corner)) {
- del_panel(_wintree->pan);
- del_panel(_wintree->workpan);
- delwin(_wintree->win);
- delwin(_wintree->workwin);
-
- _wintree->win = newwin(_wintree->cur.h, _wintree->cur.w,
- _wintree->cur.y, _wintree->cur.x);
- _wintree->workwin = newwin(_wintree->cur.h - 2, _wintree->cur.w - 2,
- _wintree->cur.y + 1, _wintree->cur.x + 1);
- _wintree->pan = new_panel(_wintree->win);
- _wintree->workpan = new_panel(_wintree->workwin);
-
- _redraw_window();
- }
- }
-
- void _handle_resize(Gpm_Event *event)
- {
- #define SET_CORNER(x) { _resizing_win = TRUE; _resize_corner = x; }
-
- if ((event->buttons & GPM_B_LEFT) &&
- (event->type & GPM_UP)) {
- _resizing_win = FALSE;
- _resize_corner = 0;
- return;
- }
-
- if (!_resizing_win) {
- if ((event->buttons & GPM_B_LEFT) &&
- (event->type & GPM_DOWN)) {
- /* Upper left */
- if ((event->x == _wintree->win->_begx) &&
- (event->y == _wintree->win->_begy))
- SET_CORNER(1);
-
- /* Upper right */
- if ((event->x == _wintree->win->_begx + _wintree->win->_maxx) &&
- (event->y == _wintree->win->_begy))
- SET_CORNER(2);
-
- /* Lower left */
- if ((event->x == _wintree->win->_begx) &&
- (event->y == _wintree->win->_begy + _wintree->win->_maxy))
- SET_CORNER(3);
-
- /* Lower right */
- if ((event->x == _wintree->win->_begx + _wintree->win->_maxx) &&
- (event->y == _wintree->win->_begy + _wintree->win->_maxy))
- SET_CORNER(4);
- }
- } else {
- _do_resize(event);
- }
-
- #undef SET_CORNER
- }
-